/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import DAO.CustodiaDAO;
import DAO.MuestraDAO;
import Entidad.Custodia;
import Entidad.Muestra;
import java.sql.Connection;
import java.sql.SQLException;

/**
 *
 * @author Juan
 */
public class ControlCustodia {
    
    private CustodiaDAO custodiaDAO = new CustodiaDAO();
    private MuestraDAO muestraDAO = new MuestraDAO();
    
    public void registrarAlmacenamiento(Muestra muestra, Custodia custodia) throws Exception {
        double cantidadContramuestra = custodia.getCantidadContramuestra();
        double cantidadMuestraAnalisis = custodia.getCantidadMuestraAnalisis();
        
        if(cantidadContramuestra == 0.0 && cantidadMuestraAnalisis == 0.0)
            throw new Exception("Se debe especificar una cantidad de muestra diferente de cero para alguno de los campos.");
        if(cantidadContramuestra + cantidadMuestraAnalisis > muestra.getCantidad())
            throw new Exception("La cantidad de muestra a almacenar no debe ser mayor que la cantidad "
                    + String.format("de muestra registrada inicialmente (%.1f gramos).", muestra.getCantidad()));
        
        String responsableAlmacenamiento = custodia.getResponsableAlmacenamiento();
        if(responsableAlmacenamiento == null || responsableAlmacenamiento.length() == 0)
            throw new Exception("Se debe especificar un responsable del almacenamiento.");
        
        ConexionDB conexionBaseDeDatos = new ConexionDB();
        try (Connection conexion = conexionBaseDeDatos.establecerConexion()) {
            custodiaDAO.update(custodia, conexion);
            muestra.setAlmacenada(true);
            muestraDAO.update(muestra, conexion);
            conexion.close();
        }
    }
    
    public void registrarDevolucionSobrantes(Muestra muestra, Custodia custodia) throws Exception {
        if (custodia.getCantidadSobrantes() == 0.0)
            throw new Exception("Se debe especificar una cantidad de sobrantes mayor que cero.");
        if (custodia.getCantidadSobrantes() > muestra.getCantidad())
            throw new Exception(String.format("La cantidad de sobrantes no debe ser mayor que la cantidad de muestra "
                    + "registrada inicialmente (%.1f gramos)", muestra.getCantidad()));
        
        ConexionDB conexionBaseDeDatos = new ConexionDB();
        try (Connection conexion = conexionBaseDeDatos.establecerConexion()) {
            custodiaDAO.update(custodia, conexion);
            muestra.setSobrantesDevueltos(true);
            muestraDAO.update(muestra, conexion);
            conexion.close();
        }
    }
    
    public void registrarDevolucion (Muestra muestra, Custodia custodia) throws Exception {
        double cantidadMuestraDevolucion = custodia.getCantidadMuestraDevolucion();
        double cantidadContramuestra = custodia.getCantidadContramuestra();
        double cantidadMuestraAnalisis = custodia.getCantidadMuestraAnalisis();
        
        if (cantidadMuestraDevolucion == 0.0)
            throw new Exception("La cantidad de muestra a disponer o devolver debe ser mayor que cero.");
        if (cantidadMuestraDevolucion > cantidadContramuestra + cantidadMuestraAnalisis)
            throw new Exception(String.format("La cantidad de muestra a devovler debe ser menor que la suma de la contramuestra "
                    + "y la muestra análisis (%.1f gramos).", cantidadContramuestra + cantidadMuestraAnalisis));
        
        ConexionDB conexionBaseDeDatos = new ConexionDB();
        try (Connection conexion = conexionBaseDeDatos.establecerConexion()) {
            custodiaDAO.update(custodia, conexion);
            muestra.setDevuelta(true);
            muestraDAO.update(muestra, conexion);
            conexion.close();
        }
    }
    
    public void registrarDisposicionRadioactiva (Muestra muestra, Custodia custodia) throws Exception {
        double cantidadMuestraDevolucion = custodia.getCantidadMuestraDevolucion();
        double cantidad = muestra.getCantidad();
        
        if (cantidadMuestraDevolucion == 0.0)
            throw new Exception("La cantidad de muestra a disponer debe ser mayor que cero.");
        if (cantidadMuestraDevolucion > cantidad) 
            throw new Exception(String.format("La cantidad de muestra a disponer debe ser menor que la "
                    + "cantidad de muestra registrada inicialmente (%.1f gramos)", cantidad));
        
        ConexionDB conexionBaseDeDatos = new ConexionDB();
        try (Connection conexion = conexionBaseDeDatos.establecerConexion()) {
            custodiaDAO.update(custodia, conexion);
            muestra.setDevuelta(true);
            muestraDAO.update(muestra, conexion);
            conexion.close();
        }
    }
    
    public Custodia cargarCustodia(Custodia custodia) throws SQLException {
        ConexionDB conexionBaseDeDatos = new ConexionDB();
        try (Connection conexion = conexionBaseDeDatos.establecerConexion()) {
            Custodia nueva = custodiaDAO.load(custodia, conexion);
            conexion.close();
            return nueva;
        }
    }
    
}
